package com.qf.controller;

import com.qf.pojo.Result;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.IncorrectCredentialsException;
import org.apache.shiro.authc.UnknownAccountException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.crypto.hash.Md5Hash;
import org.apache.shiro.subject.Subject;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

/**
 * @author mkr
 * @version V1.0
 * @Project java2203-mkr
 * @Package com.qf.controller
 * @Description:
 * @Date 2022/6/14 14:19
 */
@Controller
public class LoginController {

    /**
     * 用户登录
     * @param username 页面输入的用户名
     * @param password 页面输入的密码
     * @param rememberMe 页面勾选记住我
     * @return
     */
    @RequestMapping("/doLogin")
    public String doLogin(String username , String password , boolean rememberMe){
        //1、将页面输入的明文密码，进行MD5加密
        password = new Md5Hash(password , username , 1024).toString();
        System.out.println("====密码密文====" + password);

        //2、将页面输入的用户名、密码封装成Shiro需要的用户名密码对象
        UsernamePasswordToken token = new UsernamePasswordToken(username , password);

        //3、判断是否需要记住我，如果是，那么设置记住我选项
        if (rememberMe){
            token.setRememberMe(true);
        }

        //4、获取Subject对象，这个是Shiro框架，当前登录用户对象
        Subject subject = SecurityUtils.getSubject();

        try {
            //5、调用当前登录对象的认证方法, 将用户名, 密码对象传入, 让shiro进行认证
            //  当调用了这个login方法的时候, 那么shiro会自动执行自定义Realm类中的认证方法
            subject.login(token);
        }
        //6、捕获异常并返回给用户错误提示信息
        catch (UnknownAccountException e) {
            return "/login.jsp";
        }catch (IncorrectCredentialsException e){
            return "/login.jsp";
        }catch (AuthenticationException e){
            return "/login.jsp";
        }

        //7、登录成功跳转到首页
        return "/index.jsp";
    }

    @RequestMapping("/logout")
    @ResponseBody
    public Result logout(){
        //1、获取subject对象，当前登录用户对象
        Subject subject = SecurityUtils.getSubject();

        //2、调用退出方法，清除shiro的session中保存的用户信息
        subject.logout();

        //3、跳转到登录页面，让用户重新登录
        return Result.ok("退出成功！");
    }

}
